#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "randomgenerateclass.h"
#include "bubblesortclass.h"
#include "quicksortclass.h"

#include <vector>

MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 1.创建子线程对象
    RandomGenerateClass* randomGenerate = new RandomGenerateClass;
    BubbleSortClass* bubble = new BubbleSortClass;
    QuickSortClass* quick = new QuickSortClass;

    // 2.启动子线程
    // 点击按钮后创建一个线程产生随机数
    connect(ui->pushButton_generate, &QPushButton::clicked, this, [=]() {
        randomGenerate->setRandomCount(ui->spinBox_count->value());
        randomGenerate->start(); // 启动线程，开始生成随机数
    });

    // 接收产生的随机数，并显示
    connect(randomGenerate, &RandomGenerateClass::sendVector, this, [=](std::vector<int> randomVector) {
        bubble->receiveVector(randomVector); // 冒泡排序接收随机数
        quick->receiveVector(randomVector);  // 快速排序接收随机数
        // 显示在随机数列表中
        ui->listWidget->clear(); // 清除之前的数据
        for (int i = 0; i < randomVector.size() && i < 50; i++)//只展示前50条
        {
            ui->listWidget->addItem(QString::number(randomVector[i]));
        }
    });

    // 点击排序按钮后开始排序
    connect(ui->pushButton_sort, &QPushButton::clicked, this, [=]() {
        bubble->start(); // 启动线程，开始冒泡排序
        quick->start();  // 启动线程，开始快速排序
    });

    // 显示冒泡排序结果
    connect(bubble, &BubbleSortClass::sortResult, this, [=](std::vector<int> resultVector) {
        ui->listWidget_bubble->clear(); // 清除之前的数据
        for (int i = 0; i < resultVector.size() && i < 50; i++)//只展示前50条
        {
            ui->listWidget_bubble->addItem(QString::number(resultVector[i]));
        }
    });

    // 显示快速排序结果
    connect(quick, &QuickSortClass::sortResult, this, [=](std::vector<int> resultVector) {
        ui->listWidget_quick->clear(); // 清除之前的数据
        for (int i = 0; i < resultVector.size() && i < 50; i++)//只展示前50条
        {
            ui->listWidget_quick->addItem(QString::number(resultVector[i]));
        }
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}
